﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using SistemaDeBastanteodePoderes.Negocio;
using SistemaDeBastanteodePoderes.Dominio;
using SistemaDeBastanteodePoderes.Persistencia;
using Spring.Context.Support;

namespace SistemaDeBastanteodePoderes.Pruebas.Negocio
{
    [TestFixture]
    public class Test_H2_AbogadoService
    {
        IApplicationContext Spring = null;
        IAbogadoService Service = null;
        Representante representanteRegistrado = null;
        TipoDocumento tipoDocCreado = null;

        Cliente      clienteCreado = null;
        TipoEmpresa tipoEmpCreado = null;

        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaPersistencia.xml",
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaNegocio.xml"
                );
            Service = (IAbogadoService)Spring.GetObject("abogadoService");
            tipoEmpCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Crear(new TipoEmpresa() { Abreviacion = "SAA", Descripcion = "SOCIEDAD ANONIMA ABIERTA" });
            clienteCreado = ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Crear(new Cliente() 
            { nroRUC = "RUC01",
              razSocial = "RAZON01",
              fecIniOperaciones = DateTime.Now,
              tipEmpresa = tipoEmpCreado,
              cntEmpleados = 17
             });
            tipoDocCreado = ((ITipoDocumentoDAO)Spring.GetObject("tipoDocDAO_NH")).Crear(new TipoDocumento() {  TipCorto = "DNI", TipLargo = "DOCUMENTO NACIONAL"});
        }

        [Test]
        public void Test1_InscribirRepresentante_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                representanteRegistrado = Service.InscribirRepresentante(tipoDocCreado.Codigo, "DOC01", "NOMBRE01", "", "CARGO01", "A", clienteCreado.Codigo);

            });
        }

        [Test]
        public void Test2_InscribirRepresentante_OK()
        {

            Assert.DoesNotThrow(delegate
            {
                representanteRegistrado = Service.InscribirRepresentante(tipoDocCreado.Codigo, "DOC01", "NOMBRE01", "APELLIDO01", "CARGO01", "A", clienteCreado.Codigo);
            });

            Assert.IsNotNull(representanteRegistrado);
            Assert.Greater(representanteRegistrado.Codigo, 0);
            Assert.AreEqual(representanteRegistrado.TipDoc.Codigo,tipoDocCreado.Codigo);
            Assert.AreEqual(representanteRegistrado.NroDoc, "DOC01");
            Assert.AreEqual(representanteRegistrado.Nombres , "NOMBRE01");
            Assert.AreEqual(representanteRegistrado.Empresa.Codigo ,  clienteCreado.Codigo);
        }

        [Test]
        public void Test3_InscribirRepresentante_RepetidoMismaEmpresa()
        {
            Representante representanteRepetido = null;

            Assert.Catch<EntidadRepetidaException>(delegate
            {
                representanteRepetido = Service.InscribirRepresentante(tipoDocCreado.Codigo, "DOC01", "NOMBRE11", "APELLIDO11", "CARGO11", "A", clienteCreado.Codigo);
            });

            Assert.IsNull(representanteRepetido);

        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistrado);
            ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteCreado);
            ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Eliminar(tipoEmpCreado);
            ((ITipoDocumentoDAO)Spring.GetObject("tipoDocDAO_NH")).Eliminar(tipoDocCreado);
            Spring.Dispose();
            Spring = null;
        }

    }
}